//
//  CoreDataManager.swift
//  SwiftToDoList
//
//  Created by 谢志敏 on 2025/7/8.
//

import Foundation
import CoreData


// static 在swift中使用更加广泛，是一个在类 结构体和枚举中通用的一个声明类属性的关键字
// 但是class只能在类中使用该关键字，因此仅仅说这是一个新的标准，而Class是OC在之前的语言中的挂件子
class CoreDataManager {
    static let shared = CoreDataManager()
    
    // 尾随闭包加立即执行函数可以试下延迟初始化并且仅仅只执行一次
//    lazy var 该变量仅仅会在属性第一次访问时才会被初始化，这样在应用刚开始启动时不需要进行更多的预加载
//    懒加载仅仅只能声明为var因为他需要在实例初始化之后才进行初始化
//    闭包的返回值会作为属性的初始值返回
    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "NoteMaker")
        container.loadPersistentStores { describtion, error in
            if let error = error {
                fatalError("Core data 加载失败")
            }
        }
        return container
    }()
    
//    NSManagedObjectContext负责管理NSManagedObject的生命周期，数据操作以及持久化存储
//    托管对象是一个临时工作区，所有的coredata的操作 增删改查都在这里进行，属于一个暂存区但是不会真的执行任何操作，直到调用save
//    为了保证数据安全因此这里会进行线程安全的操作，一定会在主线程或后台线程进行操作
    var context: NSManagedObjectContext {
        return persistentContainer.viewContext
    }
    
    func saveContext() {
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nserror = error as NSError
                fatalError("保存失败： \(nserror), \(nserror.userInfo)")
            }
        }
    }
}
